/********************************************************************
	created:	2012/3/26
	filename: 	2DSkeleton.h 
	author:		Metalgearray
	
	purpose:	Definitions for 2D skeleton system support
*********************************************************************/
#include <fstream>
#include <sstream>

#include <string>

#include "2DSkeleton.h"
#include "Renderer/TextureManager.h"

using namespace std;

Bone2D* CreateBone2D()
{
	Bone2D* bone2D = new Bone2D;
	AddActorToGame(bone2D);

	return bone2D;
}

Skeleton2D* CreateSkeleton2D()
{
	Skeleton2D* skeleton2D = new Skeleton2D;
	AddActorToGame(skeleton2D);

	return skeleton2D;
}

Bone2D::Bone2D() : m_FirstChild(0), m_FirstSibling(0)
{
	//m_TransMat.BuildTranslationMatrix(Vector3(m_Position.x, m_Position.y, 0.0f));
	m_TransMat = m_TransMat.BuildTranslationMatrix(Vector3(2.0f, 1.0f, 0.0f));
}

void Bone2D::Render()
{
	RenderSystem::DrawLine(Vector3(m_Position.x, m_Position.y, 0.0f), Vec3_Transform(Vector3(m_Position.x, m_Position.y, 0.0f), m_TransMat), GWColor(1.0f, 0.0f, 0.0f));
	RenderSystem::RenderText("test Bone", 500, 600);
}


Skeleton2D::Skeleton2D() : m_BoneCount(1)
{

}

void Skeleton2D::LoadSkeleton2D()
{

	//ifstream iMeshFile("Data/BoxMan.X", ios::in);
	////if(!iMeshFile)return false;

	//string iLine;
	//bool Skeleton = false;
	//int FrameNo = 0; //int MCNo = 0;

	//while(getline(iMeshFile, iLine))
	//{
	//	istringstream sin(iLine);
	//	string KeyWord;

	//	sin>>KeyWord;

	//	if (KeyWord == "Frame" && !Skeleton)
	//	{
	//		while (KeyWord != "}")
	//		{
	//			getline(iMeshFile, iLine);
	//			istringstream sin2(iLine);

	//			sin2>>KeyWord;

	//			if (KeyWord == "FrameTransformMatrix")
	//			{
	//				getline(iMeshFile, iLine);

	//				// TODO: Should be function like: LoadXMatrix (string &line, Mat4 meshMat)
	//				//LoadXMatrix(iLine, mesh._meshMat);
	//				string &line = iLine;
	//				Matrix4 mat;

	//				float m[4][4];
	//				for (int i = 0; i < 4; i++)
	//				{
	//					for (int j = 0; j < 4; j++)
	//					{
	//						m[i][j] = (float)atof(line.c_str());

	//						int a = line.find(",");
	//						line = line.assign(line, a + 1, line.length() - a -1);
	//					}
	//				}

	//				mat.m11 = m[0][0]; mat.m12 = m[0][1]; mat.m13 = m[0][2]; mat.m14 = m[0][3];
	//				mat.m21 = m[1][0]; mat.m22 = m[1][1]; mat.m23 = m[1][2]; mat.m24 = m[1][3];
	//				mat.m31 = m[2][0]; mat.m32 = m[2][1]; mat.m33 = m[2][2]; mat.m34 = m[2][3];
	//				mat.m41 = m[3][0]; mat.m42 = m[3][1]; mat.m43 = m[3][2]; mat.m44 = m[3][3];

	//				Vector3 vec3 = Vec3_Transform(Vector3(m_Position.x, m_Position.y, 0), mat);

	//				m_Position = Vector2(vec3.x, vec3.y);

	//				Skeleton = true;
	//				break;
	//			}
	//		}
	//	}
	//	if (Skeleton == true)	
	//	{
	//		break;
	//	}
	//	

	//	//if (KeyWord == "Frame" && Skeleton)		//GXY: FUNNY! (- -b)
	//	//{
	//	//	unsigned int RecursiveCode = 0;
	//	//	sin>>KeyWord;

	//	//	LoadXFrame(mesh._pFrame, RecursiveCode, KeyWord, iMeshFile, iLine, mesh);

	//	//	//mesh._Animated = true;
	//	//}

	//	//if (KeyWord == "Animation")
	//	//{
	//	//	while (KeyWord != "AnimationKey")
	//	//	{
	//	//		getline(iMeshFile, iLine);	//GXY: name
	//	//		istringstream sin2(iLine);
	//	//		sin2>>KeyWord;
	//	//	}

	//	//	getline(iMeshFile, iLine);	//GXY:const 4?
	//	//	getline(iMeshFile, iLine);
	//	//	mesh._pFrame[FrameNo]._numKey = atoi(iLine.c_str());

	//	//	mesh._pFrame[FrameNo]._keyTime = new unsigned int [mesh._pFrame[FrameNo]._numKey];
	//	//	mesh._pFrame[FrameNo]._keyMat = new Matrix4X4 [mesh._pFrame[FrameNo]._numKey];

	//	//	for (unsigned int i = 0; i < mesh._pFrame[FrameNo]._numKey; i++)
	//	//	{
	//	//		getline(iMeshFile, iLine);

	//	//		mesh._pFrame[FrameNo]._keyTime[i] = atoi(iLine.c_str());
	//	//		int a = iLine.find(';');
	//	//		iLine = iLine.assign(iLine, a + 1, iLine.length() - a -1);

	//	//		int unknow = atoi(iLine.c_str());
	//	//		a = iLine.find(';');
	//	//		iLine = iLine.assign(iLine, a + 1, iLine.length() - a -1);

	//	//		LoadXMatrix(iLine, mesh._pFrame[FrameNo]._keyMat[i]);
	//	//	}

	//	//	getline(iMeshFile, iLine);
	//	//	getline(iMeshFile, iLine);

	//	//	istringstream sin3(iLine);

	//	//	sin3>>KeyWord;
	//	//	sin3>>KeyWord;

	//	//	if (!strcmp(mesh._pFrame[FrameNo]._name, KeyWord.c_str()))
	//	//	{
	//	//		FrameNo++;
	//	//	}
	//	//	else
	//	//	{
	//	//		delete [] mesh._pFrame[FrameNo]._keyTime;
	//	//		delete [] mesh._pFrame[FrameNo]._keyMat;
	//	//	}

	//}
	m_Bones = new Bone2D[m_BoneCount];
	for (unsigned int i = 0; i < m_BoneCount; i++)
	{
		m_Bones[i] = *CreateBone2D();
	}
	
}

void Skeleton2D::Render()
{
	for (unsigned int i = 0; i < m_BoneCount; i++)
	{
		m_Bones[i].Render();
	}
}